﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProtoGame.GameLib.Entities;
using ProtoGame.GameLib;
using Microsoft.Xna.Framework;
using ProtoGame.DescritoresContent;
using Microsoft.Xna.Framework.Audio;

namespace ProtoGame.Sprites
{
    class PGAtaqueEspada : AnimatedSprite
    {
        public PGAtaqueEspada(Tileset gfx)
            : base(PGIMGAtaqueEspada.CriarAnimator(), gfx)
        {
            Alive = false;
            Visible = false;
            CollisionType = TiposColisoes.AtaqueJogador;
        }

        public SoundEffect SomAtaque { get; set; }

        Vector2 DirecaoAtaque
        {
            set
            {
                if (value != Vector2.Zero)
                {
                    if (Math.Abs(value.X) >= Math.Abs(value.Y))
                        AnimationState = value.X > 0 ? PGIMGAtaqueEspada.StateAtaqueDireita : PGIMGAtaqueEspada.StateAtaqueEsquerda;
                    else
                        AnimationState = value.Y < 0 ? PGIMGAtaqueEspada.StateAtaqueCima : PGIMGAtaqueEspada.StateAtaqueBaixo;
                }
            }
        }

        public void Atacar(TimeSpan duracao, Vector2 direcao, Vector2 posSeguraArma)
        {
            DirecaoAtaque = direcao;
            Position = posSeguraArma - PGIMGAtaqueEspada.PosicaoPixelSeguraArma(AnimationState);
            Lifetime = duracao;
            Visible = true;
            Alive = true;

            if (SomAtaque != null)
                SomAtaque.Play();

            // HACK: atualiza a posição da espada antes da exibição em posição errada
            Update(new GameTime());
        }

        public override void Update(Microsoft.Xna.Framework.GameTime gameTime)
        {
            // Nunca anda
            Velocity = Vector2.Zero;

            base.Update(gameTime);
        }

        public override void DoCollision(byte collisionType)
        {
            // Não reage a colisão
        }

        public static PGAtaqueEspada CriarAtaqueEspada(Tileset gfx, SoundEffect sfx)
        {
            PGAtaqueEspada pgae = new PGAtaqueEspada(gfx);
            pgae.SomAtaque = sfx;

            return pgae;
        }
    }
}
